﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConfeccionesJR.Entites;
using ConfeccionesJR.Repository;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.BussinesLogic
{
    public class CompraBL:ICompraBL
    {
        [Dependency]
        public ICompraRepository compraDAO { get; set; }

        [Dependency]
        public IVentaRepository ventaDAO { get; set; }
        
        [Dependency]
        public IDetalleCompraRepository detalleComDAO { get; set; }

        [Dependency]
        public IMaterialRepository materialRepository { get; set; }

        [Dependency]
        public IUnidadMedidaRepository unidadRepository{ get; set; }

        public List<COMPRA> GetAllFromCompra()
        {
            return compraDAO.GetAllFromCompra();
        }

        public List<COMPRA> GetFromCompraByProveedor(string descripcion)
        {
            return compraDAO.GetFromCompraByProveedor(descripcion);
        }

        public List<COMPRA> GetFromCompraByNroGuia(string descripcion)
        {
            return compraDAO.GetFromCompraByNroGuia(descripcion);
        }

        public COMPRA GetFromCompraById(int id)
        {
            return compraDAO.GetFromCompraById(id);
        }

        public void AddCompra(COMPRA compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);

            if (ok)
            {
                compraDAO.AddCompra(compra);

                #region UpdateStock
                foreach (var item in compra.DETALLECOMPRAs)
                {
                    var material = materialRepository.GetFromMaterialById(item.materialId);
                    var und = unidadRepository.GetFromUnidadMedidaById(material.unidadMedidaId);
                    
                    material.UNIDAD_MEDIDA = und;
                    material.Stock = material.Stock + item.Cantidad;
                    materialRepository.UpdateMaterial(material);
                }
                #endregion

            }
            else
            {
                throw new Exception(msg);
            }            
        }

        public void UpdateCompra(COMPRA compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);

            if (ok)
            {
                #region UpdateStock
                foreach (var item in compra.DETALLECOMPRAs)
                {
                    var existeDetal = detalleComDAO.GetDetalleCompraByMaterialIdAndCompraId(item.materialId, compra.Id);

                    if (existeDetal != null)//modificado
                    {
                        if (item.Cantidad != existeDetal.Cantidad)
                        {
                            var material = materialRepository.GetFromMaterialById(item.materialId);
                            var und = unidadRepository.GetFromUnidadMedidaById(material.unidadMedidaId);
                            
                            material.UNIDAD_MEDIDA = und;
                            material.Stock = material.Stock - existeDetal.Cantidad + item.Cantidad;
                            materialRepository.UpdateMaterial(material);
                        }
                    }
                    else//nuevo
                    {
                        var material = materialRepository.GetFromMaterialById(item.materialId);
                        var und = unidadRepository.GetFromUnidadMedidaById(material.unidadMedidaId);
                        
                        material.UNIDAD_MEDIDA = und;
                        material.Stock = material.Stock + item.Cantidad;
                        materialRepository.UpdateMaterial(material);
                    }
                }
                #endregion   
             
                compraDAO.UpdateCompra(compra);
            }
            else
            {
                throw new Exception(msg);
            } 
        }

        public List<COMPRA> GetFromComprabyFechasAndProveedor(DateTime? fec1, DateTime? fec2, string proveedor)
        {
            return compraDAO.GetFromComprabyFechasAndProveedor(fec1, fec2, proveedor);
        }


        public List<COMPRA> GetFromComprabyFechasAndNroGuia(DateTime? fec1, DateTime? fec2, string nroGuia)
        {
            return compraDAO.GetFromComprabyFechasAndNroGuia(fec1, fec2, nroGuia);
        }
    }
}
